#ifndef EXAMPLE_HTTP_SERVER_H
#define EXAMPLE_HTTP_SERVER_H

#include "../../include/http_request.h"
#include "../../include/http_response.h"
#include "../../include/http_context.h"
#include "../../include/tcp_server.h"
// #include "../../include/mysql_manager.h" // 引入 MySQL 管理类

constexpr int DEFALT_TIMEOUT = 10;

namespace example {

/**
 * @brief HTTP服务器类
 * 处理HTTP请求，支持静态资源服务和动态路由
 */
class HttpServer 
{
public:
    using Handler = std::function<void(const http::HttpRequest&, http::HttpResponse*)>;
    using Handlers = std::vector<std::pair<std::regex, Handler>>;
    /**
     * @brief 构造函数
     * @param port 监听端口
     * @param timeout 连接超时时间（秒）
     */
    HttpServer(int port, int timeout = DEFALT_TIMEOUT);
    
    /**
     * @brief 设置静态资源根目录
     * @param path 目录路径
     */
    void setBaseDir(const std::string& path)
    {
        assert(http::HttpUtil::isDirectory(path) == true);
        _basedir = path;
    }

    // 客户端请求 → 解析（方法+路径）→ 
    // │
    // ├─ 动态路由匹配（按方法查路由表，正则全匹配）
    // │   ├─ 匹配成功 → 调用处理函数（带参数）
    // │   └─ 匹配失败 → 转向静态路由
    // │
    // └─ 静态路由检查（_basedir + 路径是否为文件）
    //     ├─ 是 → 返回文件内容（如 text/html）
    //     └─ 否 → 返回 404 错误
    
    /**
     * @brief 注册GET请求路由
     * @param pattern 路径正则表达式
     * @param handler 请求处理函数
     */
    void Get(const std::string& pattern, const Handler& handler)
    { _getRoute.push_back(std::make_pair(std::regex(pattern), handler)); }
    
    /**
     * @brief 注册POST请求路由
     * @param pattern 路径正则表达式
     * @param handler 请求处理函数
     */
    void Post(const std::string& pattern, const Handler& handler)
    { _postRoute.push_back(std::make_pair(std::regex(pattern), handler)); }
    
    /**
     * @brief 注册PUT请求路由
     * @param pattern 路径正则表达式
     * @param handler 请求处理函数
     */
    void Put(const std::string& pattern, const Handler& handler)
    { _putRoute.push_back(std::make_pair(std::regex(pattern), handler)); }
    
    /**
     * @brief 注册DELETE请求路由
     * @param pattern 路径正则表达式
     * @param handler 请求处理函数
     */
    void Delete(const std::string& pattern, const Handler& handler)
    { _deleteRoute.push_back(std::make_pair(std::regex(pattern), handler)); }
    
    /**
     * @brief 设置工作线程数量
     * @param count 线程数
     */
    void setThreadCount(int count) 
    { _server.setThreadCount(count); }
    
    /**
     * @brief 启动服务器监听
     */
    void listen()
    { _server.start(); }

    // /**
    //  * @brief 获取 MySQL 管理类实例
    //  * @return MySQL 管理类的共享指针
    //  */
    // std::shared_ptr<util::MySQLManager> getMySQLManager() const
    // {
    //     return _mysqlManager;
    // }

private:
    /**
     * @brief 错误处理（生成错误页面）
     * @param req HTTP请求
     * @param rsp HTTP响应
     */
    void errorHandler(const http::HttpRequest& req, http::HttpResponse* rsp);
    
    /**
     * @brief 组织并发送HTTP响应
     * @param conn 连接对象
     * @param req HTTP请求
     * @param rsp HTTP响应
     */
    void writeReponse(const net::PtrConnection& conn, const http::HttpRequest& req, http::HttpResponse& rsp);
    
    /**
     * @brief 判断是否为静态资源请求
     * @param req HTTP请求
     * @return 是静态资源返回true，否则false
     */
    bool isFileHandler(const http::HttpRequest& req) const;
    
    /**
     * @brief 处理静态资源请求
     * @param req HTTP请求
     * @param rsp HTTP响应
     */
    void fileHandler(const http::HttpRequest& req, http::HttpResponse* rsp);
    
    /**
     * @brief 分发功能性请求
     * @param req HTTP请求
     * @param rsp HTTP响应
     * @param handlers 路由表
     */
    void dispatcher(http::HttpRequest& req, http::HttpResponse* rsp, Handlers& handlers);
    
    /**
     * @brief 请求路由分发
     * @param req HTTP请求
     * @param rsp HTTP响应
     */
    void route(http::HttpRequest& req, http::HttpResponse* rsp);
    
    
    /**
     * @brief 新连接回调
     * @param conn 连接对象
     */
    void onConnected(const net::PtrConnection& conn);
    
    /**
     * @brief 消息处理回调
     * @param conn 连接对象
     * @param buffer 数据缓冲区
     */
    void onMessage(const net::PtrConnection& conn, net::Buffer* buffer);

    /**
     * @brief 关闭回调
     * @param conn 连接对象
     */
    void onClosed(const net::PtrConnection& conn);

private:
    Handlers _getRoute;         // GET请求路由表
    Handlers _postRoute;        // POST请求路由表
    Handlers _putRoute;         // PUT请求路由表
    Handlers _deleteRoute;      // DELETE请求路由表
    std::string _basedir;       // 静态资源根目录
    net::TcpServer _server;     // TCP服务器实例
    // std::shared_ptr<util::MySQLManager> _mysqlManager; // MySQL 管理类实例
};

} // namespace example

#endif // EXAMPLE_HTTP_SERVER_H